<?php
declare(strict_types=1);

namespace Zms\Validate;

/**
 * - REQUIRED 必填
 * - REQUIRED_CHOOSE 必选
 * - REQUIRED_UPLOAD 必传
 * - SAFE 安全接收
 * - DEFAULT 默认值
 * - STRING 字符串
 * - IN 包含验证
 * - EXCLUDE_IN 不能选择此项，和IN结果相反
 * - IDENTITY_NUMBER 身份证号
 * - URL 网址URL
 * - POINT 坐标
 * - EMAIL 电子邮件
 * - IP IP地址
 * - PHONE | MOBILE 手机号
 * - LIST 列表
 * - ARRAY 数组
 * - MATCH 正则验证
 * - NUMBER 数字验证
 * - INT 整数验证
 * - MONEY 金额验证
 * - QQ QQ号验证
 * - DATETIME 日期时间
 * - DATE 日期
 * - DATE_FORMAT 日期格式验证
 * - LIST_INTERSECT 列表相交
 * - JSON JSON字符串
 * - COMPARE 对比
 * - ACCEPTED 选择状态
 * - ZIPCODE 邮政编码
 * - VIOLATE 违禁词检测
 * - DOMAIN 域名判断
 * - BANKCARD 银行卡验证
 */
class Type
{
    /**
     * 限定数据必填
     * - 'error' string 未填写时的错误信息
     */
    const REQUIRED = 'required';

    /**
     * 限定数据必选
     * - 'error' string 未选择时的错误信息
     */
    const REQUIRED_CHOOSE = 'required-choose';

    /**
     * 限定数据必选
     * - 'error' string 未选择时的错误信息
     */
    const REQUIRED_UPLOAD = 'required-upload';

    /**
     * 代表数据是安全的,直接接收
     */
    const SAFE = 'safe';


    /**
     * 设置默认值
     * - 'value' mixed 设置默认值
     */
    const DEFAULT = 'default';

    /**
     * 字符串类型数据验证
     * - 'max' int 字符串最大长度
     * - 'max_error' string 字符串最大长度验证失败提醒
     * - 'min' int 字符串最少长度
     * - 'min_error' int 字符串最少长度错误验证提示
     * - 'error' int 类型验证失败错误提示
     */
    const STRING = 'string';

    /**
     * 检查数据是否包含
     * - 'enums' array [1,2,3,4]
     * - 'error' string 错误信息
     * - 'strict' bool 是否开启严格模式，开启后将同时验证类型
     */
    const IN = 'in';


    /**
     * 检查数据是否包含
     * - 'enums' array [1,2,3,4]
     * - 'error' string 错误信息
     * - 'strict' bool 是否开启严格模式，开启后将同时验证类型
     */
    const EXCLUDE_IN = 'exclude-in';


    /**
     * 检查数据是否包含
     * - 'enums' array [1,2,3,4]
     * - 'error' string 错误信息
     * - 'strict' bool 是否开启严格模式，开启后将同时验证类型
     * - 'allow_other' bool 是否允许出现指定范围外的值
     * - 'allow_other_error' string 出现指定范围外的值提示的错误
     * - 'exclude_invalid' bool 是否排除无效值
     */
    const MULTI_SELECTOR = 'multi-selector';

    /**
     * 身份证号码验证
     * -'error' string 验证失败的错误信息
     * -'strict' bool 是否开启严格验证,false时只验证长度,默认true
     */
    const IDENTITY_NUMBER = 'identity-number';

    /**
     * 验证一个网址是否合法
     * - 'error' string 验证失败的错误信息
     */
    const URL = 'url';

    /**
     * 验证数据是否输一个经纬度 ["lng"=>105.123432,"lat"=>31.234212]
     * - 'error' string 验证失败的错误信息
     */
    const POINT = 'point';

    /**
     * 验证数据是否是一个邮箱  12345@qq.com
     * - 'error' string 验证失败的错误信息
     */
    const EMAIL = 'email';

    /**
     * IP验证
     * - 'error' string IP验证失败提醒
     * - 'type' string 指定验证IP类型  ipv4或ipv6
     * - 'type_error' string IP类型验证失败
     */
    const IP = 'ip';

    /**
     * 验证数据是否是一个手机号  19888887777
     * - 'error' string 验证失败的错误信息
     */
    const PHONE = 'phone';

    /**
     * 验证数据是否是一个手机号  19888887777
     * - 'error' string 验证失败的错误信息
     */
    const MOBILE = 'mobile';

    /**
     * 验证数据是否是一个list数据  [1,2,3]
     * - 'error' string 类型验证失败提醒
     * - 'type' string LIST元素类型  这次number和string
     * - 'type_error' string 元素类型验证失败
     * - 'count' int  指定元素数量
     * - 'count_error' string  指定元素数量验证失败
     * - 'min' int  最少元素数量
     * - 'min_error' string  最少元素数量验证失败错误信息
     * - 'max' int  最多元素数量
     * - 'max_error' string  最多元素数量验证失败错误信息
     * - 'enums' array|callback 判断数据元素是否属于此配置
     * - 'enums_error' string 数据元素不合法的错误提示
     * - 'split'  false|string 当传入数据为字符串时是否进行分割  false为不分割   string时为分割符号
     */
    const LIST = 'list';

    /**
     * 验证数据是否是一个数组  [1,2,3]
     * - 'error' string 验证失败提醒
     */
    const ARRAY = 'array';

    /**
     * 正则验证器
     * - 'pattern' string 正则表达式
     * - 'not' bool 结果是否需要取反
     * - 'error' string 验证失败信息
     */
    const MATCH = 'match';

    /**
     * 数字验证
     * - 'error' string 数据类型未通过验证
     * - 'max' int 数字最大值
     * - 'max_error' string 数字最大值验证失败
     * - 'min' int 数字最小值
     * - 'min_error' int 数字最小值验证失败
     * - 'precision' int 数字精度
     * - 'precision_error' string 数字精度验证未通过
     */
    const NUMBER = 'number';

    /**
     * 整数验证
     * - 'error' string 数据类型未通过验证
     * - 'max' int 数字最大值
     * - 'max_error' string 数字最大值验证失败
     * - 'min' int 数字最小值
     * - 'min_error' int 数字最小值验证失败
     */
    const INT = 'int';

    /**
     * 金额验证
     * - 'error' string 数据类型未通过验证
     * - 'max' int 数字最大值
     * - 'max_error' string 数字最大值验证失败
     * - 'min' int 数字最小值
     * - 'min_error' int 数字最小值验证失败
     */
    const MONEY = 'money';

    /**
     * QQ验证
     * - 'error' string QQ未通过验证
     */
    const QQ = 'qq';

    /**
     * 时间日期验证器
     * - 'error' string 时间日期验证未通过
     * - 'format' string  时间日期格式
     * - 'format_error' string  时间日期格式验证失败
     */
    const DATETIME = 'datetime';


    /**
     * 日期验证器
     * - 'error' string 时间日期验证未通过
     * - 'format_error' string  时间日期格式验证失败
     */
    const DATE = 'date';


    /**
     * 时间格式验证
     * - 'error' string 时间日期验证未通过
     * - 'output' string|null  输出格式 string为指定格式 null不更改
     * - 'completion' string  输入时间格式，通过当前时间格式来补全时间
     * - 'timestamp' bool  是否输出时间戳
     */
    const DATE_FORMAT = 'date-format';

    /**
     * 判断两个数组列表是否有交集
     * - 'error' string 验证失败信息
     * - ‘enums’ array|callback 验对比的数据
     */
    const LIST_INTERSECT = 'list-intersect';

    /**
     * JSON验证器
     * - 'error' string 验证失败信息
     */
    const JSON = 'json';


    /**
     * 一致性对比
     * - 'find' string 需要对比的字段
     * - 'error' string '验证失败提示'
     */
    const COMPARE = 'compare';

    /**
     * 确认验证通过
     * - 'enums' LIST ['ok','yes', 1, '1', true, 'true'] 以下值为通过值
     * - 'error' string 验证失败值
     */
    const ACCEPTED = 'accepted';


    /**
     * 邮编验证
     * - 'error' string 验证失败值
     */
    const ZIPCODE = 'zipcode';


    /**
     * 违禁词检测
     * - 'words' string[] 要检测的违禁词
     * - 'model' warn|replace  warn是警告模式  replace是替换模式
     */
    const VIOLATE = 'violate';


    /**
     * 域名判断
     * - 'error' string 域名验证失败提示
     * - 'clear_ending' bool 是否去掉域名最后的/
     * - 'scheme' array|false 验证网络协议  有值时为必须，如['https','http']，则域名必须时其中的协议
     * - 'port' bool 是否允许带端口,默认允许
     * - 'ip' bool 是否允许IP 默认允许
     */
    const DOMAIN = 'domain';


    /**
     * 银行卡验证
     * - 'strict' bool 是否开启严格验证模式,false时2222-3333-4444-5555-666或2222 3333 4444 5555 666都可通过，true时只能通过纯数字2222333344445555666
     * - 'luhn' bool 是否开启luhn规则校验
     * - 'convert' bool 是否转换数据，true会去掉空格和横线
     */
    const BANKCARD = 'bankcard';
}